package model

import com.fasterxml.jackson.annotation.JsonIgnore
import java.util.ArrayList
import java.util.List

abstract class Personaje {
	
	@Property var String nombre = ""
	@Property val sexosPosibles = #["Femenino","Masculino"]
	
	override toString(){
		nombre
	}
}


class Villano extends Personaje{
	
	/* 
	  Puse las señas y hobbies como listas de Strings.
	  Podriamos implementarlas como subclases de una Superclase Dato. Modificar en caso de ser asi. 
	*/
	
	@Property var String sexo
	@Property val ArrayList<String> senhas = newArrayList
	@Property val ArrayList<String> hobbies = newArrayList
	

	
	/**
	 * Proposito: Agrega una nueva seña a las señas del villano.
	 */
	def agregarSenhaParticular(String nuevaSenha){
		this.senhas.add(nuevaSenha)
	}
	
	/**
	 * Proposito: Elimina una seña de las señas del villano.
	*/ 	
	def quitarSenhaParticular(String unaSenha){
		this.senhas.remove(unaSenha)
	}

	/**
	 * Proposito: Agrega uno nuevo hobbie a los hobbies del villano.
	 */
	def agregarHobbie(String nuevoHobbie){
		this.hobbies.add(nuevoHobbie)
	}
	
	/**
	 * Proposito: Elimina un Hobbie de los hobbies del villano.
	 */ 
	def quitarHobbie(String hobbieDel){
		this.hobbies.remove(hobbieDel)
	}
	
	 def equals(Villano villano) {
		this.nombre.equals(villano.nombre)
	}
	
}


class Detective extends Personaje{
	
	@Property var Pais paisActual
	@JsonIgnore @Property var Pais paisAnterior = null
	@JsonIgnore @Property val List<Pista> pistas= newArrayList
	@JsonIgnore @Property var OrdenDeArresto ordenArresto
	@Property String ruta 
	
	def void viajarAlSiguientePais(Pais pais){
		this.paisAnterior = this.paisActual
		this.paisActual = pais
		this.ruta = '''«ruta» <-- «pais.toString»'''
	}
	
	def void volverAlPaisAnterior() {
		val paisAux = this.paisActual
		this.paisActual = paisAnterior
		this.paisAnterior = paisAux
	}
	
	def void generarOrdenDeArrestoPara(Villano villano){
		this.ordenArresto = new OrdenDeArresto(villano)
	}
	
	def boolean atraparCriminal(Villano villano){
		if(this.ordenArresto == null){
			this.ordenArresto = new OrdenDeArresto(new Villano)
		}	
		this.ordenArresto.concuerdaConElVillano(villano)
	}
	
	def consultar(Lugar lugar){
		this.pistas.addAll(lugar.consultar)
	}
	
}